package com.xinhe.cn.cpbox.service.impl;

import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.xinhe.cn.cpbox.common.Result;
import com.xinhe.cn.cpbox.entity.po.UserInfo;
import com.xinhe.cn.cpbox.mapper.MatchMakerMapper;
import com.xinhe.cn.cpbox.mapper.UserInfoMapper;
import com.xinhe.cn.cpbox.payutils.WXPayParms;
import com.xinhe.cn.cpbox.service.UserService;
import com.xinhe.cn.cpbox.utils.FileUtil;
import com.xinhe.cn.cpbox.utils.TencenCloudUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.io.File;
import java.util.Objects;

/**
 * @author HB
 * @date 2021/10/09 15:13
 */
@Slf4j
@Service
public class UserServiceImpl implements UserService {
    @Autowired
    UserInfoMapper userInfoMapper;
    @Autowired
    TencenCloudUtil tencenCloudUtil;
    @Autowired
    MatchMakerMapper matchMakerMapper;

    @Value("${constant.JAR_PATH}")
    private String JAR_PATH;

    @Override
    public Object savePicAndName(JSONObject jsonObject) {
        String openId = jsonObject.getString("openId");
        String avatarUrl = jsonObject.getString("avatarUrl");
        String nickName = jsonObject.getString("nickName");

        if (StringUtils.isBlank(openId)) {
            return Result.paramError().message("缺少openId");
        } else if (StringUtils.isBlank(avatarUrl) || StringUtils.isBlank(nickName)) {
            return Result.paramError().message("缺少头像昵称");
        }

        // 查询该人的状态
        UserInfo userInfo = userInfoMapper.selectById(openId);
        if (Objects.isNull(userInfo)) {
            return Result.error().message("查不到该人的数据");
        }

        // 上传微信头像至对象桶
        String newUrl = uploadWechatImg(openId, avatarUrl);

        if (StringUtils.isBlank(newUrl)) {
            return Result.error().message("上传微信头像失败");
        }

        // 保存头像和昵称
        UpdateWrapper<UserInfo> updateWrapper = new UpdateWrapper<>();
        updateWrapper.set("img_url", newUrl).set("nick_name", nickName).eq("open_id", openId);
        userInfoMapper.update(null, updateWrapper);

        return Result.ok();
    }

    /**
     * 上传微信头像至对象桶
     *
     * @param openId
     * @param avatarUrl
     * @return
     */
    private String uploadWechatImg(String openId, String avatarUrl) {
        // 上传头像至对象桶
        String newUrl = null;

        /*
            avatarUrl可用的测试url:
            "https://thirdwx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/46"
            windows路径:
            String newPath = FileUtil.getImageByUrl(avatarUrl, "D:\\tmp\\", openId + ".jpg");
         */
        String newPath = FileUtil.getImageByUrl(avatarUrl, JAR_PATH + "/uploadPics", openId + ".jpg");

        if ("error".equals(newPath)) {
            log.error("下载头像失败，url: {}, openId: {}", avatarUrl, openId);
        } else {
            // 七牛云
            File file = new File(newPath);

            try {
                if (file.exists()) {
                    // 腾讯云
                    try {
                        File imageFile = new File(newPath);
                        //将头像存储到对象桶
                        newUrl = tencenCloudUtil.upload(imageFile);

                        return newUrl;
                    } catch (Exception e) {
                        log.error("保存头像至对象桶失败，newPath：{}, e: ", newPath, e);
                    }
                }
            } catch (Exception e) {
                log.error("上传头像至对象桶失败，newPath：{}, e:\n", newPath, e.getStackTrace());
            } finally {
                if (file.exists()) {
                    file.delete();
                }
            }
        }

        return null;
    }

//    @Transactional
//    @Override
//    public Object authorization(String code, String exuid) {
//        if (code != null) {
//            // 通过code来换取access_token
//            JSONObject json = getWebAccessToken(code);
//
//            // 获取网页授权access_token凭据与openid
//            String webAccessToken = json.getString("access_token");
//            String openid = json.getString("openid");
//            if (StringUtils.isBlank(webAccessToken) || StringUtils.isBlank(openid)) {
//                return Result.error().message("获取授权失败");
//            }
//
//            JSONObject infObj = getUserInfo(webAccessToken, openid);
//
//            // 获取信息
//            String avatarUrl = infObj.getString("headimgurl");
//            String unid = infObj.getString("unionid");
//            String nickName = infObj.getString("nickname");
//            /*
//                微信侧的用户性别：值为1时是男性，值为2时是女性，值为0时是未知
//                我方用户性别：值为1是男性，值为0是女性，2是未知
//             */
//            String weSex = infObj.getString("sex");
//
//            System.out.println("-------------------登录打印信息-------------------");
//            System.out.println(infObj);
//            System.out.println(avatarUrl);
//            System.out.println(unid);
//            System.out.println(nickName);
//            System.out.println("-------------------登录打印信息-------------------");
//
//            // 判断并保存信息
//            boolean flag = false;   // 用于判断是否要更新头像昵称
//            boolean isNew = false;   // 用于判断是否为新人
//            // 查询用户信息
//            UserInfo userInfo = userInfoMapper.selectById(openid);
//            if (Objects.isNull(userInfo)) {
//                userInfo = new UserInfo();
//                userInfo.setOpenId(openid);
//
//                System.out.println("exuid + " + exuid);
//                // 获取推广人的信息
//                if (StringUtils.isNotBlank(exuid)) {
//                    String extendId = userInfoMapper.selectOpendIdByUid(exuid);
//                    System.out.println(extendId);
//                    userInfo.setExtendId(extendId);
//                }
//                isNew = true;
//            }
//
//            // 头像为空
//            if (StringUtils.isBlank(userInfo.getImgUrl())) {
//                String imgUrl = uploadWechatImg(openid, avatarUrl);
//                if (!StringUtils.isBlank(imgUrl)) {
//                    userInfo.setImgUrl(imgUrl);
//                    flag = true;
//                }
//            }
//            // 昵称为空
//            if (StringUtils.isBlank(userInfo.getNickName())) {
//                userInfo.setNickName(nickName);
//                flag = true;
//            }
//
//            System.out.println("weSex + " + weSex);
//            // 性别为空/我方性别为未知微信为已知
//            if (!"0".equals(weSex) && (StringUtils.isBlank(userInfo.getSex()) || "2".equals(userInfo.getSex()))) {
//                String sex = "1".equals(weSex) ? "1" : "0";
//                userInfo.setSex(sex);
//                flag = true;
//            }
//
//            // 更新数据
//            if (flag) {
//                userInfo.setUnid(unid);
//                if (isNew) {
//                    userInfoMapper.insert(userInfo);
//                    userInfo = userInfoMapper.selectById(openid);
//                    if(StringUtils.isNotBlank(userInfo.getExtendId())) {
//                        // 推广人月老信息的推广用户数 + 1
//                        matchMakerMapper.addUserNum(userInfo.getExtendId(), 1);
//                    }
//                } else {
//                    userInfoMapper.updateById(userInfo);
//                }
//            }
//            return Result.ok().data("userInfo", userInfo);
//        } else {
//            return Result.paramError().message("code is null");
//        }
//    }

    @Transactional
    @Override
    public Object authorization(String code, String exuid) {
        if (code != null) {
            // 通过code来换取access_token
            JSONObject json = getWebAccessToken(code);

            // 获取网页授权access_token凭据与openid
            String webAccessToken = json.getString("access_token");
            String openid = json.getString("openid");
            if (StringUtils.isBlank(webAccessToken) || StringUtils.isBlank(openid)) {
                return Result.error().message("获取授权失败");
            }

            // 查询用户信息
            UserInfo userInfo = userInfoMapper.selectById(openid);
            if (Objects.isNull(userInfo)) {
                userInfo = new UserInfo();
                userInfo.setOpenId(openid);

                // 获取推广人的信息
                if (StringUtils.isNotBlank(exuid)) {
                    String extendId = userInfoMapper.selectOpendIdByUid(exuid);

                    if (StringUtils.isNotBlank(extendId)) {
                        userInfo.setExtendId(extendId);
                        // 推广人月老信息的推广用户数 + 1
                        matchMakerMapper.addUserNum(userInfo.getExtendId(), 1);
                    }
                }

                userInfoMapper.insert(userInfo);
                userInfo = userInfoMapper.selectById(openid);
            }

            return Result.ok().data("userInfo", userInfo);
        } else {
            return Result.paramError().message("code is null");
        }
    }

    /**
     * 通过code获取wenAccessToken与openId
     *
     * @param code
     * @return
     */
    public static JSONObject getWebAccessToken(String code) {
        String GET_WEB_ACCESSTOKEN_URL = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + WXPayParms.PUBLIC_APPID + "&secret=" + WXPayParms.PUBLC_SECRET + "&code=" + code + "&grant_type=authorization_code";
        String result = HttpUtil.get(GET_WEB_ACCESSTOKEN_URL);
        return JSONObject.parseObject(result);
    }

    /**
     * 通过openId和token获取用户昵称头像等信息
     *
     * @param accessToken
     * @param openId
     * @return 正确时返回的JSON数据包如下：
     * {
     * "openid": "OPENID",    // openId
     * "nickname": NICKNAME,  // 昵称
     * "sex": 1,  // 用户的性别，值为1时是男性，值为2时是女性，值为0时是未知
     * "headimgurl":"https://thirdwx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/46",
     * "unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL" // 用户的unid
     * }
     */
    public static JSONObject getUserInfo(String accessToken, String openId) {
        String GET_USERINFO_URL = "https://api.weixin.qq.com/sns/userinfo?access_token=" + accessToken + "&openid=" + openId + "&lang=zh_CN";
        String result = HttpUtil.get(GET_USERINFO_URL);
        return JSONObject.parseObject(result);
    }
}
